/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mif18.orm;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 *
 * @author Quentin
 *
 * Cette classe implémente l'entité "vin" de la base de données. => on ajoute
 * entity
 * @Entity nous indique que cette classe est une classe persistante.
 * @Table permet de definir le nom de la table en base de donnée si le nom
 * diffère.
 */
@Entity
@Table(name = "vin")
public class Vin implements Serializable {

    private String nom;
    private int annee;
    /**
     * Pour relier un énumérateur à un type String, on passe par l'annotation
     * Enumerated
     */
    @Enumerated(EnumType.STRING)
    private CouleurVin couleur;
    /**
     * Identifiant. On utilise
     * @Id afin de definir le champ id comme clé primaire On utilise
     * @GeneratedValue pour générer une valeur automatique pour la clé primaire
     */
    @Id
    @GeneratedValue
    private int id;
    /**
     * Relation unique d'un vin et d'un producteur. 1 vers 1 donc relation
     * OneToOne On join avec la colonne id de la table producteur. nullable pour
     * eviter une relation vers une entité null, un vin relié à aucun producteur
     * n'a pas de sens.
     */
    @OneToOne
    @JoinColumn(name = "id", unique = true, nullable = false)
    private Producteur producteur;
    /**
     * Relation unique d'un vin et son appelation 1 vers 1 donc relation
     * OneToOne On join avec la colonne id de la table Appelation. nullable pour
     * eviter une relation vers une entité null, un vin sans appelation n'a pas
     * de sens.
     */
    @OneToOne
    @JoinColumn(name = "id", unique = true, nullable = false)
    private Appellation appellation;
    /**
     * Relation multiple vers la relation de composition On construit la
     * coolection de composition grace à la clef clefComposition.vin Qui fait le
     * lien entre une composition et une composition unaire pour recréer la
     * classe.
     */
    @OneToMany(mappedBy = "clefComposition.vin")
    private Collection<Composition> composition;

    /**
     * Fin des compositions
     */
    public void setComposition(Collection<Composition> mComposition) {
        this.composition = mComposition;
    }

    public Collection<Composition> getComposition() {
        return composition;
    }

    public void setProducteur(Producteur mProducteur) {
        this.producteur = mProducteur;
    }

    public Producteur getProducteur() {
        return producteur;
    }

    public Appellation getAppellation() {
        return appellation;
    }

    public void setAppellation(Appellation appellation) {
        this.appellation = appellation;
    }

    public void setCouleur(CouleurVin couleur) {
        this.couleur = couleur;
    }

    public CouleurVin getCouleur() {
        return couleur;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public int getAnnee() {
        return annee;
    }

    public void setAnnee(int annee) {
        this.annee = annee;
    }

    // equals et hashcode on été générés automatiquement dans l'IDE
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + this.id;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Vin other = (Vin) obj;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    public enum CouleurVin {

        rouge, blanc, rose;
    }
}
